<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //第一个参数this指向
    //第二个参数可以是任意数据类型
    //三者中的this被强绑定在指定的那个对象上
    //定义一个 myCall方法
    function myCall(fn,obj, ...arr) {

        //判断this的类型， //处理obj为null 和 undefined 的情况
        if (obj === null || obj === undefined) {
            obj = obj || window
        }

        // 给obj添加方法，将this挂到obj的属性上 
        obj.Fn = fn

        // 创建变量 —————— 传进来的参数传进fn即可
        let callBack = obj.Fn(...arr)

        delete obj.Fn // 删除添加的方法

        return callBack; // 返回函数执行的结果
    }


    // 运用场景-继承
    function Animal(name) {
        this.name = name;
        this.showName = function () {
            console.log(this.name);
        }
    }
    
    function Cat(name) {
        Animal.call(this, name);
    }
    var cat = new Cat('Black Cat');
    cat.showName();



    //运用场景-伪数组转化为数组
    var fakeArr = { 0: 'a', 1: 'b', length: 2 };

    console.log(
        // (fakeArr instanceof  Array)
        // Object.prototype.toString.call(fakeArr)
    );

    var arr1 = Array.prototype.slice.call(fakeArr);

    console.log(
        (arr1 instanceof  Array)
    );
</script>